package cn.ronghuanet.org.controller;

import cn.ronghuanet.auth.annotation.RonghuaPermission;
import cn.ronghuanet.basic.utils.AjaxResult;
import cn.ronghuanet.basic.utils.PageList;
import cn.ronghuanet.org.domain.Department;
import cn.ronghuanet.org.query.DepartmentQuery;
import cn.ronghuanet.org.service.IDepartmentService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;

/**
 * 我们的controller上面都使用@RestController,因为本项目是一个前后端分离项目,后端只需要向前端返回数据就可以了,不需要响应页面的,因此我们后端都是不走视图解析器的,
 * 因此都是用@RestController
 */
@RestController
@RequestMapping("/department")
@Api(value = "部门管理",description = "部门管理描述")
@RonghuaPermission(name = "部门管理",descs = "部门管理权限")
public class DepartmentController {

    @Autowired
    private IDepartmentService departmentService;

    /**
     * 新增/修改可以共用一个接口,根据id有没有值来进行区分
     * 当put请求/post请求接收一个对象作为参数时,必须要加@RequestBody,表明从请求体中获取参数
     * 前后端分离项目,后端只提供接口进行操作,前端怎么知道你后端操作是成功还是失败呢??是需要由后端告知前端我当前操作的结果是成功还是失败,如果是失败,还需要告知失败原因
     * 所以后端需要返回操作是成功还是失败,以及失败原因   success:true(成功) false(失败)   message:失败原因
     * 怎么返回前端结果??????
     * 方式一:  拼接一个json格式的字符串返回,  {"success":false,"message":"新增或修改失败!"} 这种方式不建议使用,拼接起来麻烦容易出错
     * 方式二:  使用map封装返回  这种方式也可以,但是写起来还是比较麻烦
     * 方式三:  自己封装一个返回值的类,它里面就有success  message这两个字段
     * @param department
     */
    //@RequestMapping(method = RequestMethod.PUT) // 说明当前方法需要一个put请求方式
    @PutMapping // 等价于上面这句话@RequestMapping(method = RequestMethod.PUT)
    @ApiOperation(value = "新增/修改部门")
    @RonghuaPermission(name = "新增/修改",descs = "新增/修改部门")
    public AjaxResult addOrUpdate(@RequestBody Department department){
        try {
            // 判断id是否有值,注意Objects.isNull 不能判断字符串和集合 因为""属于空字符串,而不是null
            if(Objects.isNull(department.getId())){
                // id为null,说明是新增
                departmentService.add(department);
            }else{
                // id不为null,说明是修改操作
                departmentService.update(department);
            }
            return AjaxResult.me();
        } catch (Exception e) {
            e.printStackTrace();
            // 如果操作失败,会进入catch
            return AjaxResult.me().setSuccess(false).setMessage(e.getMessage());
        }
    }

    /**
     * 根据ID删除
     * @param id
     * @return
     */
    @DeleteMapping("/{id}")
    @ApiOperation(value = "根据ID删除")
    @RonghuaPermission(name = "根据ID删除",descs = "根据ID删除")
    public AjaxResult removeById(@ApiParam(name = "主键",required = true) @PathVariable("id")Long id){
        try {
            departmentService.removeById(id);
            return AjaxResult.me();
        } catch (Exception e) {
            e.printStackTrace();
            return AjaxResult.me().setSuccess(false).setMessage(e.getMessage());
        }
    }

    @PatchMapping
    @ApiOperation(value = "批量删除")
    @RonghuaPermission(name = "批量删除",descs = "批量删除")
    public AjaxResult batchRemove(@RequestBody List<Long> ids){
        try {
            departmentService.batchRemove(ids);
            return AjaxResult.me();
        } catch (Exception e) {
            e.printStackTrace();
            return AjaxResult.me().setSuccess(false).setMessage(e.getMessage());
        }
    }

    /**
     * 查询也需要告知前端,我当前是成功还是失败
     * 查询的时候,不仅要告知前端操作结果是成功还是失败,还需要将查询出来的结果也返回给前端,这种情况下就需要在AjaxResult返回结果中再新增一个字段,这个字段是
     * 用来返回查询的结果给前端的
     */
    @GetMapping("/{id}")
    @ApiOperation(value = "根据ID查询")
    @RonghuaPermission(name = "根据ID查询",descs = "根据ID查询")
    public AjaxResult getById(@ApiParam(name = "主键",required = true) @PathVariable("id")Long id){
        try {
            Department department = departmentService.getById(id);
            // 将查询出来的结果也返回给前端
            return AjaxResult.me().setResultObj(department);
        } catch (Exception e) {
            e.printStackTrace();
            return AjaxResult.me().setSuccess(false).setMessage(e.getMessage());
        }
    }

    /**
     * 查询所有
     * @return
     */
    @GetMapping
    @ApiOperation(value = "查询所有")
    @RonghuaPermission(name = "查询所有",descs = "查询所有")
    public AjaxResult getAll(){
        try {
            List<Department> departments = departmentService.getAll();
            // 将查询出来的结果也返回给前端
            return AjaxResult.me().setResultObj(departments);
        } catch (Exception e) {
            e.printStackTrace();
            return AjaxResult.me().setSuccess(false).setMessage(e.getMessage());
        }
    }

    @PostMapping
    @RonghuaPermission(name = "分页查询",descs = "分页查询")
    public AjaxResult pageList(@RequestBody DepartmentQuery query){
        try {
            // 调用service进行分页查询
            PageList<Department> pageList = departmentService.pageList(query);
            return AjaxResult.me().setResultObj(pageList);
        } catch (Exception e) {
            e.printStackTrace();
            return AjaxResult.me().setSuccess(false).setMessage(e.getMessage());
        }
    }

    /**
     * 获取所有的一级部门和它们的二级部门
     * @return
     */
    @GetMapping("/tree")
    @RonghuaPermission(name = "部门树",descs = "部门树")
    public AjaxResult tree(){
        try {
            // 这块返回的是一级部门
            List<Department> list = departmentService.tree();
            return AjaxResult.me().setResultObj(list);
        } catch (Exception e) {
            e.printStackTrace();
            return AjaxResult.me().setSuccess(false).setMessage("部门树查询失败!"+e.getMessage());
        }
    }
}
